import java.util.Random;

import javax.net.ssl.SSLSocket;
import comun.Lector_socket;
import comun.Mensaje;


public class ClienteTest {
	private static final String[] votos= {"positivo", "negativo", "abstencion"};
	private final static int SLEEP=150;

	private int estado;
	private Lector_socket lector;
	private String id;

	private boolean flag_votacion_azar;
	private boolean cerrar_sesion;
	
	private ContadorConectados contadorConectados;
	private GeneradorVotos generadorVotos;

	public ClienteTest(SSLSocket socket, String id, boolean votacion_azar, ContadorConectados cc, GeneradorVotos gv){
		estado = 1;
		// crear la puta conexi�n ssl

		// ver donde se agregan valore aleatorios
		// ver donde agregar los threads
		lector = new Lector_socket(socket); 
		this.id= id;
		flag_votacion_azar=votacion_azar;
		contadorConectados=cc;
		generadorVotos=gv;
	}

	public void simular(boolean cortar){
		contadorConectados.incrementar();
		
		cerrar_sesion=false;
		if(cortar){
			Random random=new Random();
			int dado = random.nextInt(3);
			if(dado==1){
				desconectar();
			}
		}



		while(!cerrar_sesion){
			Mensaje msj = new Mensaje();
			Mensaje rta=null;
			switch(estado){
			case 1: {
				msj.setTipo_msj(Mensaje.TIPO_SALUDO);
				msj.setContenido(id); // para simular el IMEI
				lector.enviar_msj(msj);
				try {Thread.sleep(SLEEP);} catch (InterruptedException e) {e.printStackTrace();}
				rta = lector.leer_msj();
				if(rta!=null && rta.getTipo_msj().equals(Mensaje.TIPO_SI))
					estado = 2;
				break;
			}
			case 2: {
				msj.setTipo_msj(Mensaje.TIPO_HAY_TEMA);
				lector.enviar_msj(msj);
				try {Thread.sleep(SLEEP);} catch (InterruptedException e) {e.printStackTrace();}
				rta = lector.leer_msj();
				if(rta!=null && rta.getTipo_msj().equals(Mensaje.TIPO_SI))
					estado = 3;
				//if(cortar)// <<<<<< obligar a cortar
				//estado = 6;
				break;
			}
			case 3: {
				msj.setTipo_msj(Mensaje.TIPO_HAY_VOTACION);
				lector.enviar_msj(msj);
				try {Thread.sleep(SLEEP);} catch (InterruptedException e) {e.printStackTrace();}
				rta = lector.leer_msj();
				if(rta!=null && rta.getTipo_msj().equals(Mensaje.TIPO_SI))
					estado = 4;
				break;
			}
			case 4: {
				msj.setTipo_msj(Mensaje.TIPO_VOTO);
				Random ran = new Random();
				//msj.setContenido(Mensaje.VOTO_POSITIVO);
				/*
				int voto=ran.nextInt(3);
				msj.setContenido(votos[voto]);
				*/
				String voto=generadorVotos.retirarVoto();
				msj.setContenido(voto);
				if(flag_votacion_azar){
					int time=ran.nextInt(60)*1000;
					try {Thread.sleep(time);} catch (InterruptedException e) {e.printStackTrace();}
				}
				lector.enviar_msj(msj);
				try {Thread.sleep(SLEEP);} catch (InterruptedException e) {e.printStackTrace();}
				rta = lector.leer_msj();
				//System.out.println("Cliente "+id+" enviando voto "+votos[voto]);
				System.out.println("Cliente "+id+" enviando voto "+voto);
				if(rta!=null && rta.getTipo_msj().equals(Mensaje.TIPO_OK))
					estado = 5;
				break;
			}
			case 5: {
				msj.setTipo_msj(Mensaje.TIPO_HAY_NUEVO_TEMA);
				lector.enviar_msj(msj);
				try {Thread.sleep(SLEEP);} catch (InterruptedException e) {e.printStackTrace();}
				rta = lector.leer_msj();
				if(rta!=null && rta.getTipo_msj().equals(Mensaje.TIPO_SI))
					estado = 2;
				else if(rta!=null && rta.getTipo_msj().equals(Mensaje.TIPO_CIERRE_SESION))
					estado = 6;
				break;
			}
			case 6: {
				cerrar_sesion = true;

				break;
			}
			}

			// enviar msj
			// leer rta
			/*
			if(rta!=null){
				System.out.println("-> "+msj.getTipo_msj());
				System.out.println("<- "+rta.getTipo_msj());
				System.out.println("ESTADO: "+estado);
			}
			 */
			if(rta==null)
				cerrar_sesion=true;
			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
				System.err.println("Problema con la conexion: "+e.getMessage());
				cerrar_sesion=true;
			}
		}


		lector.cerrar();
		contadorConectados.decrementar();
		System.out.println("Cliente "+id+" desconectado");
	}


	private void desconectar(){
		Runnable run = new Runnable(){
			public void run(){
				Random random = new Random();
				int tiempo = random.nextInt(SimuladorClientes.MINUTO*5);
				System.out.println("El cliente "+id+" se va desconectar en "+(tiempo/SimuladorClientes.MINUTO)+" minutos");
				try{Thread.sleep(tiempo);}catch(Exception e){e.printStackTrace();};
				cerrar_sesion=true;
				System.out.println("Deberia cerrarse la conexi�n del cliente "+id);
			}
		};
		new Thread(run).start();
	}


}
